package algorithm_training.with_gold;

import java.util.Scanner;

/**
 * 有一个N x N的方格,每一个格子都有一些金币,只要站在格子里就能拿到里面的金币。
 * 你站在最左上角的格子里,每次可以从一个格子走到它右边或下边的格子里。请问如何走才能拿到最多的金币。
 */
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int[][] g = new int[n][n];
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                g[i][j] = sc.nextInt();
            }
        }
        // 使用dp数组表示走到某一格的时候能获取的最大金币数
        int[][] dp = new int[n][n];
        // 初始化dp数组
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                if (i == 0 && j == 0) {
                    dp[i][j] = g[i][j];
                } else if (i == 0 && j > 0) {
                    dp[i][j] = dp[i][j - 1] + g[i][j];
                } else if (i > 0 && j == 0) {
                    dp[i][j] = dp[i - 1][j] + g[i][j];
                } else {
                    // 中间态
                    if (dp[i - 1][j] >= dp[i][j - 1]) {
                        dp[i][j] = dp[i - 1][j] + g[i][j];
                    } else {
                        dp[i][j] = dp[i][j - 1] + g[i][j];
                    }
                }
            }
        }
        System.out.println(dp[n - 1][n - 1]);
    }
}
